Computer programs, such as multi-threaded programs, typically run in a computer environment where the Operating System (OS), such as Microsoft Windows®, and possibly a runtime environment as well, such as the Java® Virtual Machine® (JVM), control one or more executable program threads, where an executable program is associated with a thread at a particular time. In addition, each executable program may access a shared resource, such as shared memory.
The interactions between the OS, threads, executable program and shared resource may produce chaotic behavior. This is primarily due to the complexity of the computer environment and the effect that small perturbations may have on the executable program's results. These perturbations have numerous causes and manifestations, most notably related to the timing of executed program instructions, and often result in intermittent execution errors that may be traced back to a programming error or “bug.”
In addition to using manual techniques to detect programming errors, automated bug detection tools may be used. While existing bug detection tools provide information regarding the performance and validity of typical computer programs, increasingly complex programs have created a need for more sophisticated bug detection techniques. This is particularly true with regard to multi-threaded computer programs where program execution errors may be caused by environmental factors that may make bugs more elusive.